/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Negocios;

import Gestores.DtoObjects.AfiliadoDTO;
import Gestores.DtoObjects.CuotaDTO;
import Gestores.DtoObjects.DetallePagoDTO;
import Gestores.Entidades.EntidadCuota;
import Gestores.Entidades.EntidadDetallePago;
import Gestores.Factory.FactoryClass;
import java.sql.Date;
import java.util.ArrayList;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Lion
 */
public class DetallePagoNegocio {

    private DetallePagoDTO dto;
    private EntidadDetallePago entidad;
    private AfiliadoDTO gestorAfiliado;
    private CuotaDTO cuotaDTO;

    public DetallePagoNegocio() {
        this.dto = FactoryClass.getDetallePagoInstance();
        this.gestorAfiliado = FactoryClass.getAfiliadoInstance();
        this.cuotaDTO = FactoryClass.getCuotaInstance();
    }

    public void insertarPago(String afi, Date fecha, int mes, int anho, String Monto) throws Exception {
        ArrayList<Object> l = gestorAfiliado.buscarPorId(afi);
        if (l.size() > 0) {
            l = cuotaDTO.buscarPorMesAnho(mes, anho);
            if (l.size() > 0) {
                entidad = dto.buscarPorAfiCuota(mes, anho, afi);
                if (entidad != null) {
                    throw new Exception("El Afiliado con codigo: " + afi + " , ya pago"
                            + " la cuota " + String.valueOf(mes) + "-" + String.valueOf(anho));
                } else {
                    entidad = new EntidadDetallePago(mes, anho, afi, 0, Integer.valueOf(Monto), fecha.getTime(), false);
                    this.dto.insertar(entidad);
                }
            } else {
                throw new Exception("Error, no existe la cuota");
            }

        } else {
            throw new Exception("Error en el codigo de afiliado");

        }

    }

    public ArrayList<EntidadDetallePago> BuscarDetallePagoCuota(int m, int a) throws Exception {
        ArrayList<EntidadDetallePago> l = dto.buscarPorIdCuota(m, a);
        if (l.size() > 0) {
            return l;
        } else {
            throw new Exception("Nadie pago la cuota");
        }
    }

    public EntidadDetallePago BuscarDetallePagoAfiCuota(int m, int a, String afi) throws Exception {
        if (afi.length() > 0 && afi.length() < 6) {
            EntidadDetallePago l = dto.buscarPorAfiCuota(m, a, afi);
            if (l != null) {
                return l;
            } else {
                throw new Exception("El Afiliado no realizo el pago");
            }
        } else {
            throw new Exception("El codigo del afiliado debe ser menor a 6 caracteres ");
        }

    }

    public ArrayList<EntidadDetallePago> BuscarDetallePagoIdAfi(String Afi) throws Exception {
        if (Afi.length() > 0 && Afi.length() < 6) {
            AfiliadoDTO aDTO = new AfiliadoDTO();
            ArrayList<Object> a = aDTO.buscarPorId(Afi);
            if (a.size() > 0) {
                ArrayList<EntidadDetallePago> l = dto.buscarPorIdAfiliado(Afi);
                if (l.size() > 0) {
                    return l;
                } else {
                    throw new Exception("El Afiliado no realizo el pago");
                }
            } else {
                throw new Exception("Afiliado no existe");
            }

        } else {
            throw new Exception("Error en codigo de afiliado, debe ser menor a 6 caracterres");
        }

    }

    public DefaultTableModel tabularDatos(ArrayList<EntidadDetallePago> listaDatos) {
        String[] campos = new String[]{"Mes", "Anho", "Cod Afiliado", "Id Usuario", "monto", "Fecha"};
        DefaultTableModel model = new DefaultTableModel(campos, 0);

        for (int i = 0; i < listaDatos.size(); i++) {
            EntidadDetallePago ePago = (EntidadDetallePago) listaDatos.get(i);
            if (!ePago.isEstado()) {
                Object[] camposCuota = new Object[]{obtenerMesNombre(ePago.getId_mes()), ePago.getId_A(),
                    ePago.getId_afiliado(), ePago.getId_usuario(), ePago.getMonto(), ePago.getFecha()
                };

                model.addRow(camposCuota);
            }
        }

        return model;
    }

    public void eliminacionLogica(String afi, int mes, int anho) throws Exception {
        if (afi.length() > 0 && afi.length() < 6) {
            EntidadDetallePago l = BuscarDetallePagoAfiCuota(mes, anho, afi);
            if (l != null) {
                EntidadDetallePago entidad = new EntidadDetallePago(mes, anho, afi, 0, 0, null, true);
                dto.eliminacionLogica(entidad);
            } else {
                throw new Exception("El Pago que desea eliminar no existe en base de datos");
            }
        }else{
            throw new Exception("Error con el formato del codigo del afiliado");
        }


    }

    public int obtenerMesCodigo(String m) {

        if (m == "Enero") {
            return 0;
        }
        if (m == "Febrero") {
            return 1;
        }
        if (m == "Marzo") {
            return 2;
        }
        if (m == "Abril") {
            return 3;
        }
        if (m == "Mayo") {
            return 4;
        }
        if (m == "Junio") {
            return 5;
        }
        if (m == "Julio") {
            return 6;
        }
        if (m == "Agosto") {
            return 7;
        }
        if (m == "Septiembre") {
            return 8;
        }
        if (m == "Octubre") {
            return 9;
        }
        if (m == "Nobiembre") {
            return 10;
        }
        if (m == "Diciembre") {
            return 11;
        }

        return -1;

    }

    private String obtenerMesNombre(int m) {
        switch (m) {
            case 0:
                return "Enero";
            case 1:
                return "Febrero";
            case 2:
                return "Marzo";
            case 3:
                return "Abril";
            case 4:
                return "Mayo";
            case 5:
                return "Junio";
            case 6:
                return "Julio";
            case 7:
                return "Agosto";
            case 8:
                return "Septiembre";
            case 9:
                return "Octubre";
            case 10:
                return "Nobiembre";
            case 11:
                return "Diciembre";
            default:
                return " ";

        }
    }
}
